package com.chen.cloudpicture.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 自定义线程池配置类
 * 用于管理异步任务（如批量图片编辑、文件清理等）的线程资源
 *
 * 项目中没实际用到，这里是在写批量编辑图片大并发场景优化的 batchEditPictureMetadata方法时用到的自定义线程池。
 */
@Configuration
public class ThreadPoolConfig {

    /**
     * 自定义线程池 Bean（与项目中 @Resource 注入的名称对应）
     */
    @Bean(name = "customExecutor") // Bean的名称是customExecutor，@Resource注入的时候就要写 private ThreadPoolExecutor customExecutor;
    public ThreadPoolExecutor customExecutor() {
        // 核心线程数：CPU核心数 + 1（保证基本并发能力）
        int corePoolSize = Runtime.getRuntime().availableProcessors() + 1;
        // 最大线程数：核心线程数 * 2（应对突发任务峰值）
        int maximumPoolSize = corePoolSize * 2;
        // 空闲线程存活时间：60秒（超过该时间未使用的非核心线程将被回收）
        long keepAliveTime = 60;
        // 时间单位：秒
        TimeUnit unit = TimeUnit.SECONDS;
        // 任务队列：容量为1000的有界队列（避免任务无限制堆积导致OOM）
        LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(1000);
        // 拒绝策略：任务队列满时，直接抛出RejectedExecutionException（便于问题排查）
        ThreadPoolExecutor.AbortPolicy handler = new ThreadPoolExecutor.AbortPolicy();

        // 创建并返回线程池实例
        return new ThreadPoolExecutor(
                corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                handler
        );
    }
}